package java_thinking.unit_17;

import java.io.Serializable;

/**
 * @Desc:   1.Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里（序列化），并且可以从其它地方把该Byte 流里的数据读出来（反序列化）
 *          2.必看：https://blog.csdn.net/u011568312/article/details/57611440
 *          3.如果我把implements Serializable 去掉，类就不能序列化了。再写入或从存储设备里或网络传输读取，就会报java.io.NotSerializableException异常
 *          4.序列化保存的是对象的状态，静态变量属于类的状态，因此 序列化并不保存静态变量，不能保存任何的成员方法和静态的成员变量，而且序列化保存的只是变量的值
 *          5.transient关键字的作用是：阻止实例中那些用此关键字声明的变量持久化；当对象被反序列化时（从源文件读取字节序列进行重构），这样的实例变量值不会被持久化和恢复
 *            当某些变量不想被序列化，同是又不适合使用static关键字声明，那么此时就需要用transient关键字来声明该变量
 *          6.利用序列化可以实现轻量级的持久性，对象在程序中必须显式的序列化和反序列化还原
 *          7.对象序列化的概念加入到语言中是为了支持两种主要特性
 *            1.是java的远程方法调用(RMI)它使存活于其他计算机上的对象使用起来就像是存活于本机一样，当远程对象发送消息时。
 *            需要通过对象序列化来传输参数和返回值；
 *            2.对java beans来说，对象的序列化是必须的，使用一个bean时一般情况下是在设计阶段对他的状态进行配置，这种状态信息必须保存
 *            下来，并在程序启动时进行后期恢复，这些具体工作就是对象序列化完成的；
 *          8.要序列化一个对象：
 *            1.创建某些OutputStream 对象
 *            2.将其封装在一个ObjectOutputStream 对象中，
 *            3.调用writeObject() 即可将对象序列化
 *            4.并将其发送给OutputStream
 *              注：对象序列化是基于字节的，因为要使用InputStream 和OutStream
 *            反序列化:InputStream --> ObjectInputStream -->readObject() -->Object向下转型
 *
 *          9.对象序列化它不仅保存了对象的全景图，而且能追踪对象内所有包含的引用，并保存那些对象，接着又能对对象内包含的
 *            每个这样的引用进行追踪，以此类推，这种情况被称为"对象网"；
 *
 *          10.对象序列化的一个重要限制是它只是java的解决方案，只有java程序才能反序列化这种对象，可以用xml格式 解决这个问题
 * @author: cww
 * @DateTime: 2019-04-26 22:33
 */

public class SerializableTheory implements Serializable {

    /**
     * 如果是通过网络传输的话，如果Person类的serialVersionUID不一致，那么反序列化就不能正常进行。
     * 例如在客户端A中Person类的serialVersionUID=1L，而在客户端B中Person类的serialVersionUID=2L 那么就不能重构这个Person对象
     * 如果没有特殊需求的话，使用用默认的 1L 就可以，这样可以确保代码一致时反序列化成功。那么随机生成的序列化 ID 有什么作用呢，
     * 有些时候，通过改变序列化 ID 可以用来限制某些用户的使用
     */
    private static final long serialVersionUID = 1L;
    String name;
    int age;

    public SerializableTheory(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "name:" + name + "\tage:" + age;

    }
}
